package main

import (
	"flag"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"redisopgen/generator"
	"redisopgen/parser"
	"strings"
)

func main() {
	// 定义命令行参数
	protoFile := flag.String("proto", "", "输入的proto文件路径")
	outputDir := flag.String("output", "", "输出目录路径")
	flag.Parse()

	// 参数检查
	if *protoFile == "" {
		fmt.Println("错误: 必须指定proto文件路径")
		flag.Usage()
		os.Exit(1)
	}

	if *outputDir == "" {
		// 默认输出到proto文件所在目录
		*outputDir = filepath.Dir(*protoFile)
	}

	//获取文件前缀
	protoFileNameWithExt := filepath.Base(*protoFile)
	protoFileName := strings.TrimSuffix(protoFileNameWithExt, filepath.Ext(protoFileNameWithExt))

	// 解析proto文件
	p := parser.NewParser()
	if err := p.ParseFile(*protoFile, parser.CapitalizeFirstLetter(protoFileName)); err != nil {
		fmt.Printf("解析proto文件失败: %v\n", err)
		os.Exit(1)
	}

	// 获取所有需要生成Redis操作的结构体
	structs := p.GetRedisStructs()
	if len(structs) == 0 {
		fmt.Println("未找到需要生成Redis操作的结构体")
		os.Exit(0)
	}

	// 生成代码
	g := generator.NewGenerator()
	for _, s := range structs {
		// 生成文件名
		fileName := protoFileName + "_" + s.Name + ".go"
		outputPath := filepath.Join(*outputDir, fileName)

		// 生成代码
		code, err := g.Generate(s, protoFileName)
		if err != nil {
			fmt.Printf("生成代码失败 %s: %v\n", s.Name, err)
			continue
		}

		// 写入文件
		if err := os.WriteFile(outputPath, []byte(code), 0644); err != nil {
			fmt.Printf("写入文件失败 %s: %v\n", outputPath, err)
			continue
		}

		cmd := exec.Command("goimports", "-w", outputPath)
		output, err := cmd.CombinedOutput()
		if err != nil {
			fmt.Printf("Error running path:%s,gofmt: %v,Output: %s\n", outputPath, err, output)
			continue
		}

		fmt.Printf("成功生成文件: %s\n", outputPath)
	}
}
